package lc6

/*
 * @lc app=leetcode.cn id=6 lang=golang
 *
 * [6] Z 字形变换
1 <= s.length <= 1000
s 由英文字母（小写和大写）、',' 和 '.' 组成
1 <= numRows <= 1000

将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：

P   A   H   N
A P L S I I G
Y   I   R
之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
*/

// @lc code=start
func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	} else if numRows == 2 {
		var result1 []byte
		var result2 []byte
		for i := 0; i < len(s); i++ {
			if i%2 == 0 {
				result1 = append(result1, s[i])
			} else {
				result2 = append(result2, s[i])
			}
		}
		return string(result1) + string(result2)
	}
	index := 0
	var convertResult []byte
	var split byte = '#'
	for index < len(s) {
		if index+numRows <= len(s) {
			convertResult = append(convertResult, []byte(s[index:index+numRows])...)
			index += numRows
		} else {
			convertResult = append(convertResult, []byte(s[index:])...)
			break
		}
		convertResult = append(convertResult, split)
		if index+numRows-2 <= len(s) {
			convertResult = append(convertResult, reverse([]byte(s[index:index+numRows-2]))...)
			index += numRows - 2
			convertResult = append(convertResult, split)
		} else {
			leave := []byte(s[index:])
			for len(leave) < numRows-2 {
				leave = append(leave, split)
			}
			convertResult = append(convertResult, reverse(leave)...)
			break
		}
	}
	var result []byte
	for i := 0; i < numRows; i++ {
		for j := i; j < len(convertResult); j += numRows {
			if convertResult[j] != split {
				result = append(result, convertResult[j])
			}
		}
	}

	return string(result)
}

func reverse(s []byte) []byte {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return s
}

// @lc code=end
